﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// NotReviewedButNeeded
#pragma once

#include "GcmpUiViewInterface.h"


namespace gcmp
{
    class IUiView;
    class ICamera;
    class ILine3d;
    class Vector3d;
    class Coordinate3d;
    struct CameraParamStruct;


    /// \brief 视图常用工具
    class GCMP_UI_VIEW_INTERFACE_EXPORT UiViewUtility
    {
    public:
        /// \brief 根据视图所在的窗口大小重置视口(包含日志回放重设视口）
        /// \param pUiView      视图
        /// \param windowWidth  新窗口宽度
        /// \param windowHeight 新窗口高度
        /// 
        static void Resize(IUiView* pUiView, int windowWidth, int windowHeight);

        /// \brief 世界坐标系下点转屏幕坐标点
        /// \param pUiView  视图
        /// \param worldPosition 世界坐标系下点
        /// \param nScreenX 新视图宽度
        /// \param nScreenY 新视图高度
        /// 
        static void WorldPositionToScreenPosition(const IUiView* pUiView, const Vector3d& worldPosition, int& nScreenX, int& nScreenY, float& depth);

        /// \brief 屏幕坐标点转世界坐标点
        /// \param pUiView  视图
        /// \param nScreenX 屏幕坐标x
        /// \param nScreenY 屏幕坐标y
        /// \return 转换后世界坐标点
        static Vector3d ScreenPositionToWorldPosition(const IUiView* pUiView, int nScreenX, int nScreenY, float depth);


        /// \brief 计算经过世界坐标点生成射线
        /// \param pUiView  视图
        /// \param worldPosition 世界坐标线
        /// \return  返回生成的射线
        static OwnerPtr<ILine3d> WorldPositionToWorldRay(const IUiView* pUiView, const Vector3d& worldPosition);

        /// \brief 计算pixelCount像素距离在世界坐标系下距离
        /// \param pUiView  视图
        /// \param pixelCount 像素距离
        /// \return 世界坐标下的距离
        static double ComputeWorldWidthFromPixel(const IUiView* pUiView, int pixelCount);


        /// \brief 获取视图拾取精度（世界坐标系下距离，注意仅适用于平行投影相机视图）
        /// \param pUiView  视图（注意：仅适用平行投影相机视图）
        /// \return  返回默认拾取精度
        static double GetPickTolerance(const IUiView* pUiView);

        /// \brief 
        /// \param[in]    const IUiView* pUiView  视图ui
        /// \return       Coordinate3d   视图ui的投影坐标系
        static Coordinate3d GetProjectionCoordinate(const IUiView* pUiView);

    };//class UIViewUtility

}//namespace gcmp
